home *** CD-ROM | disk | FTP | other *** search
/ Everything For A Hacker / 19990506-[HACK].iso / HEXEDIT / AVSZ80 / DEMO1.ASM < prev    next >
Assembly Source File  |  1985-08-20  |  4KB  |  155 lines

  1. ;    Demo Program for Z80
  2. ;    Written by Ken Anderson
  3. ;    July 1985
  4. ;
  5. ;    This program is intended to demonstrate features of
  6. ;    the Z80 CPU that are easily visualized on Avocet's
  7. ;    AVSIM Z80 Simulator.
  8. ;
  9. ;    The functions of this program include:
  10. ;
  11. ;    1. MAIN routine reads the bit pattern from PIO A Pins 0 - 3
  12. ;       and cycles it on the LEDs attached to PIO A Pins 4 - 7
  13. ;       (like a light chaser) where HI bits represent
  14. ;       LIGHT ON (or vice-versa, of course).
  15. ;       The light chaser rotates alternately to the right,
  16. ;       then to the left at a rate corresponding to
  17. ;       the binary value of the bit pattern.
  18. ;
  19. ;    2. CTC 0 interrupt routine changes the rotation direction
  20. ;       on each timeout.
  21. ;
  22. ;    3. PIO B is supporting a second task:
  23. ;       On Input interrupt, read ASCII character from 
  24. ;       port, and buffer it.
  25. ;       Special character <CR> clears the buffer contents - for
  26. ;       visual effect in the simulator!
  27. ;
  28.  
  29. ;    Variable Map
  30.  
  31. BFSIZE    EQU    31        ; Maximum Buffer size 
  32.  
  33. ;    Register Usage:
  34.  
  35. ;    D    ; store switch settings
  36. ;    E    ; 2 copies of 4 - bit pattern for rotating
  37. ;    L    ; bit 0 is direction flag
  38. ;    C    ; pointer to PIO address
  39. ;    IX    ; PIO B Int routine Buffer pointer - next free position
  40. ;    B    ; PIO B Int routine Buffer counter
  41.  
  42. ;    I/O Map
  43.  
  44. CTC0.I    EQU    0    ; CTC at 0 - 3 in I/O Space
  45. PIOAD.I    EQU    4    ; PIO at 4 - 7 in I/O Space
  46. PIOBD.I    EQU    5
  47. PIOAC.I    EQU     6
  48.  
  49.     ORG    40H
  50.  
  51. BFBASE:    DS    BFSIZE        ; PIO B Int routine Buffer space
  52.  
  53.     ORG    100H
  54.  
  55. MAIN:    LD    SP,40H        ; Stack down from BFBASE
  56.     ; Init PIO
  57.     LD    C,PIOAC.I
  58.     LD    DE,0CF0FH    ; Port A Mode 3 0-3 In, 4-7 Out
  59.     OUT    (C),D
  60.     OUT    (C),E
  61.     LD    A,7        ; Int OFF
  62.     OUT    (C),A
  63.     INC    C        ; to PIOB Control
  64.     LD    A,4FH        ; Mode 1
  65.     OUT    (C),A
  66.     LD    DE,0283H
  67.     OUT    (C),D        ; Int Vector
  68.     OUT    (C),E        ; Ints Enabled
  69.     ; Init CTC
  70.     LD    C,CTC0.I
  71.     LD     A,4        ; Int Vector
  72.     OUT    (C),A
  73.     LD     A,10010101B    ; CCW0: INT/TIMER/16/AUTO/TC follows
  74.     OUT    (C),A
  75.     IM    2        ; Mode 2
  76.     LD    A,10        ; Time Constant for direction change
  77.     OUT    (C),A
  78.     LD    A,10H        ; IV Table at 1000H: User/PIO B/CTCs
  79.     LD    I,A
  80.     ; Init LEDS
  81.     LD    C,PIOAD.I
  82.     XOR    A
  83.     OUT    (C),A        ; Clear LEDS
  84.     LD    L,A        ; Pattern rotation to right
  85.     ; Init Int task pointer
  86.     LD    IX,BFBASE
  87.     EXX
  88.     LD    B,0
  89.     EXX
  90.     EI            ; Int service ON
  91.     CALL    GETSW        ; get switch settings
  92. NEWPTRN:LD    D,A        ; save switches
  93.     SLA    A        ; rotate x 4
  94.     SLA    A        
  95.     SLA    A        
  96.     SLA    A        
  97.     OR    A,D        ; 2 copies of pattern
  98.     LD    E,A        ; save in E
  99.     LD     A,10010101B    ; CCW0: INT/TIMER/16/AUTO/TC follows
  100.     OUT    (CTC0.I),A    ; Adjust
  101.     LD    A,E        ; Time Constant for direction change
  102.     OUT    (CTC0.I),A
  103.  
  104. ROTATE:    BIT    0,L        ; get direction
  105.     JR    NZ,ROTLEFT    ; HI -> to left
  106.     RRC    E
  107.     JR    SETLEDS
  108. ROTLEFT:RLC    E
  109. SETLEDS:OUT    (C),E        ; Update LEDS
  110.     CALL    GETSW        ; Test switches
  111.     CP    D        ; change?
  112.     JR    Z,ROTATE    ; No, keep cycling
  113.     JR    NEWPTRN        ; Yes, reload
  114.  
  115. GETSW:    IN    A,(C)        ; Subroutine to show stack working
  116.     AND    0FH        ; Strip to inputs ONLY
  117.     RET
  118.  
  119. CTC:    INC    L        ; Toggle BIT 0: Direction
  120.     EI
  121.     RETI
  122.  
  123. PIO:    EX    AF,AF'        ; Swap
  124.     EXX
  125.     IN    A,(PIOBD.I)    ; Get data
  126.     LD    C,A
  127.     CP    0DH        ; <CR>?
  128.     JR    NZ,BUFCHAR    ; No, buffer character
  129. CLEAR:    LD    (IX),0        ; Yes, clear buffer to zeroes
  130.     DEC    IX        ; from back to front
  131.     DJNZ    CLEAR        ; until at front
  132.     JR    EXIT
  133.  
  134. BUFCHAR:LD    A,B    
  135.     CP    BFSIZE        ; Check if space left in buffer
  136.     JR    NC,EXIT        ; No room left
  137.     LD    (IX),C        ; Yes, save char
  138.     INC    IX
  139.     INC    B
  140. EXIT:    EX    AF,AF'
  141.     EXX
  142.     EI
  143.     RETI 
  144.  
  145.  
  146. ;    Vectors are stored at 1000H
  147.  
  148.     ORG    1000H
  149.     DW    MAIN        ; RESET if USER Int
  150.     DW    PIO        ; PIO B Input Int
  151.     DW    CTC        ; CTC 0 Timer Int
  152.  
  153.     END
  154.  
  155.